# 导入ROS Python库
import rospy
# 导入actionlib库用于创建动作服务器
import actionlib
# 从自定义包导入动作消息类型
from action_communication.msg import *

class MyAction:
    def __init__(self):
        """
        动作服务器初始化
        API: actionlib.SimpleActionServer
        参数说明：
        - "action_p": 动作名称（客户端连接的入口）
        - setarpAction: 动作消息类型（自动生成）
        - self.cb: 目标处理回调函数
        - False: 禁用自动启动，需要手动调用start()
        """
        # 创建动作服务器实例
        self.server = actionlib.SimpleActionServer("action_p", setarpAction, self.cb, False)
        # 手动启动服务器（当auto_start=False时必须调用）
        self.server.start()

    def cb(self, goal):
        """
        目标处理回调函数（核心业务逻辑）
        API: server.publish_feedback()  发布进度反馈
             server.set_succeeded()    设置最终结果
        """
        goal_goal = goal.goal  # 获取目标值
        rate = rospy.Rate(1)    # 创建1Hz速率控制器
        
        # 模拟处理过程的主循环
        for i in range(1, goal_goal+1):
            result = i  # 当前进度值
            rate.sleep()  # 维持1Hz频率
            
            # 打印日志信息
            rospy.loginfo("检测%d个零件", result)
            
            # 构造反馈消息
            fb = setarpFeedback()
            fb.progress_bar = i / goal_goal * 100  # 计算完成百分比
            
            # 发布进度反馈给客户端
            self.server.publish_feedback(fb)
        
        rate.sleep()  # 最后一次延时保证完成
        
        # 设置最终结果
        r = setarpResult()
        r.result = result == goal_goal  # 验证结果是否匹配目标
        self.server.set_succeeded(r)    # 发送成功状态

if __name__ == "__main__":
    # ROS节点初始化
    rospy.init_node("service_action")  # 节点名称
    
    # 创建动作服务器实例
    myAction = MyAction()
    
    # 保持节点运行，等待请求
    rospy.spin()  # 进入事件循环